package com.uacp.sgb.vista.controladores;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.validation.constraints.Min;

import org.primefaces.context.RequestContext;

import com.uacp.sgb.datos.dominio.entidades.Bien;
import com.uacp.sgb.datos.dominio.entidades.ComprobanteCompra;
import com.uacp.sgb.datos.dominio.entidades.Dependencia;
import com.uacp.sgb.datos.dominio.entidades.Equipo;
import com.uacp.sgb.datos.dominio.entidades.GuiaDeRemision;
import com.uacp.sgb.datos.dominio.entidades.Mueble;
import com.uacp.sgb.datos.dominio.entidades.OrdenCompra;
import com.uacp.sgb.datos.dominio.entidades.Pecosa;
import com.uacp.sgb.datos.dominio.entidades.Proveedor;
import com.uacp.sgb.datos.dominio.entidades.TipoAdquisicion;
import com.uacp.sgb.datos.dominio.entidades.TipoBien;
import com.uacp.sgb.datos.dominio.entidades.Trabajador;
import com.uacp.sgb.datos.dominio.entidades.Vehiculo;
import com.uacp.sgb.datos.dominio.persistencia.dao.DependenciaDao;
import com.uacp.sgb.datos.dominio.persistencia.dao.TipoBienDao;
import com.uacp.sgb.datos.dominio.persistencia.dao.TrabajadorDao;
import com.uacp.sgb.negocio.servicios.ServicioAdquisicion;
import com.uacp.sgb.negocio.util.UtilPrecios;
import com.uacp.sgb.vista.util.DialogBean;

@ManagedBean(name="detalles")
@ViewScoped
public class ControlDetallesAdquisicion implements Serializable
{
	private List<TipoBien> tiposBienes;
	private List<String> listaSeries = new ArrayList<>();
	private String serieSeleccionada;
	private TipoBien tipoBien;
	private Equipo equipo;
	private Vehiculo vehiculo;
	private Mueble mueble;
	
	private Equipo equipoSeleccionado;
	private Mueble muebleSeleccionado;
	
	private Dependencia dependencia;
	private List<Dependencia> dependencias;
	private Dependencia area;
	private List<Dependencia> areas;
	private Trabajador trabajador;
	private List<Trabajador> trabajadores;
	
	private Proveedor proveedor= new Proveedor(); 
	private Pecosa pecosa =new Pecosa();
	private OrdenCompra ordenCompra= new OrdenCompra();
	private GuiaDeRemision guiaderemision= new GuiaDeRemision();
	private ComprobanteCompra comprobante= new ComprobanteCompra();
	private TipoAdquisicion tipoAdquisicion = new TipoAdquisicion();
	
	@Min(1)
	private int cantidadMuebles;	
	
	private boolean mostrarEquipo = false;
	private boolean mostrarMueble = false;
	
	private String tipo;
	private int tabActual;
	private List<Equipo> listaEquipos;
	private List<Mueble> listaMuebles;
	private List<Vehiculo> listaVehiculos;
	
	public ControlDetallesAdquisicion()
	{
		equipo = new Equipo();
		vehiculo = new Vehiculo();
		mueble = new Mueble();
		
		listaEquipos = new ArrayList<>();
		listaMuebles = new ArrayList<>();
		listaVehiculos = new ArrayList<>();
		
		tiposBienes = new ArrayList<>();
		
		tiposBienes = TipoBienDao.listar();
		
		tipoBien = tiposBienes.get(0);
		
		seleccionarTipo();
		
		dependencias = DependenciaDao.listar();
		dependencia = dependencias.get(0);
		
		trabajadores = TrabajadorDao.listarPorArea(dependencia);
		
		actualizoDependencia();
	}
	
	public void eliminarSerie()
	{
		listaSeries.remove(serieSeleccionada);
	}
	
	public List<Dependencia> filtrarDependencias(String filtro)
	{
		filtro = filtro.trim().toLowerCase();
		
		List<Dependencia> filtradas = new ArrayList<>();
		
		for(Dependencia dependencia: dependencias)
		{
			if(dependencia.getNombre().toLowerCase().startsWith(filtro))
				filtradas.add(dependencia);
		}
		
		return filtradas;
	}
	
	public List<Trabajador> filtrarTrabajador(String filtro)
	{
		filtro = filtro.trim().toLowerCase();
		
		List<Trabajador> filtradas = new ArrayList<>();
		
		for(Trabajador trabajador: trabajadores)
		{
			if(trabajador.getNroDoc().toLowerCase().startsWith(filtro))
				filtradas.add(trabajador);
		}
		
		return filtradas;
	}
	
	public List<Dependencia> filtrarAreas(String filtro)
	{
		filtro = filtro.trim().toLowerCase();
		
		List<Dependencia> filtradas = new ArrayList<>();
		
		for(Dependencia dependencia: areas)
		{
			if(dependencia.getNombre().toLowerCase().startsWith(filtro) || dependencia.getCodigo().toLowerCase().startsWith(filtro) )
				filtradas.add(dependencia);
			
		}
		
		return filtradas;
	}
	
	public void actualizoDependencia()
	{	
		areas = DependenciaDao.listarAreas(dependencia);
		
		trabajadores = TrabajadorDao.listarPorArea(dependencia);
		
		area = areas.get(0);
	}
	
	public List<TipoBien> filtrarTiposBienes(String filtro)
	{
		filtro = filtro.trim().toLowerCase();
		
		List<TipoBien> filtradas = new ArrayList<>();
		
		for(TipoBien tipoBien: tiposBienes)
		{
			if(tipoBien.getDescripcion().toLowerCase().startsWith(filtro))
				filtradas.add(tipoBien);
		}
		
		return filtradas;
	}
	
	public void anadirSerie()
	{
		String serieEquipo = equipo.getSerie().trim();
		
		if(!serieEquipo.isEmpty())
		{
			if(!listaSeries.contains(serieEquipo))
			listaSeries.add(equipo.getSerie());
		}
		
		System.out.println("Tamanio: " + listaSeries.size());
	}
	
	public void eliminarBien()
	{
		if(tabActual == 1)
		{
			if(listaEquipos.contains(equipoSeleccionado))
			{
				System.out.println("Eliminado equipo");
				listaEquipos.remove(equipoSeleccionado);
			}
		}
		
		if(tabActual == 0)
		{
			if(listaMuebles.contains(muebleSeleccionado))
			{
				System.out.println("Eliminado mueble");
				listaMuebles.remove(muebleSeleccionado);
			}
		}
	}
	
	public void seleccionarTipo()
	{	
		salir:
		for(TipoBien tipo: tiposBienes)
		{
			if(tipo.equals(tipoBien))
			{
				mostrarEquipo = mostrarMueble = false;
				
				System.out.println(tipoBien.getDescripcion() + " : " + tipoBien.getCategoria());
				
				switch(tipo.getCategoria())
				{
				case "EQUIPO": 
					mostrarEquipo = true; 
					tabActual = 1; 
					equipo.setDescripcion(tipoBien.getDescripcion());
					listaSeries.clear();
					break salir;
				case "MOBILIARIO": 
					mostrarMueble = true; 
					tabActual = 0; 
					mueble.setDescripcion(tipoBien.getDescripcion()); 
					cantidadMuebles = 1;
					break salir;
				}
			}
		}
	}
	
	public void guardar(ActionEvent event)
	{
		ServicioAdquisicion servicioAdquisicion = new ServicioAdquisicion();
		
		servicioAdquisicion.setArea(area);
		servicioAdquisicion.setTrabajador(trabajador);
		servicioAdquisicion.setTipoAdquisicion(tipoAdquisicion);
		servicioAdquisicion.setEquipos(listaEquipos);
		servicioAdquisicion.setMuebles(listaMuebles);
		servicioAdquisicion.setProveedor(proveedor);
		servicioAdquisicion.setComprobanteCompra(comprobante);
		servicioAdquisicion.setPecosa(pecosa);
		servicioAdquisicion.setGuiaDeRemision(guiaderemision);
		servicioAdquisicion.setOrdenCompra(ordenCompra);
		servicioAdquisicion.setTipoBien(tipoBien);
		
		servicioAdquisicion.guardarAdquisicion();
		
		DialogBean.registroAdquisicion();
	}
	
	public void anadir(ActionEvent ae)
	{	
		String message = null;
		
		if(mostrarEquipo)
		{
			if(listaSeries.size() == 0)
			{
				message = "Falta los numeros de serie";
			}
			else
			{
				List<Double> precios = UtilPrecios.hallarPrecios(equipo.getPrecio(), listaSeries.size());
				
				for(int i = 0; i < listaSeries.size(); i ++)
				{
					Equipo equipoTemp = new Equipo();
					equipoTemp.setDescripcion(equipo.getDescripcion());
					equipoTemp.setModelo(equipo.getModelo());
					equipoTemp.setMarca(equipo.getMarca());
					equipoTemp.setSerie(listaSeries.get(i));
					equipoTemp.setPrecio(precios.get(i));
					listaEquipos.add(equipoTemp);
				}
				
				listaSeries.clear();
				equipo = new Equipo();
				message = "Equipo registrados correctamente";
			}
		}
		
		if(mostrarMueble)
		{
			List<Double> precios = UtilPrecios.hallarPrecios(mueble.getPrecio(), cantidadMuebles);
			
			for(int i = 0; i < cantidadMuebles; i ++)
			{
				Mueble muebleTemp = new Mueble();
				muebleTemp.setDescripcion(mueble.getDescripcion());
				muebleTemp.setMaterial(mueble.getMaterial());
				muebleTemp.setColor(mueble.getColor());
				muebleTemp.setDimension(mueble.getDimension());
				muebleTemp.setPrecio(precios.get(i));
				listaMuebles.add(muebleTemp);
			}
			
			mueble = new Mueble();
			message = "Mueble registrados correctamente";
		}
		
		FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, message, null);
		FacesContext.getCurrentInstance().addMessage(null, msg);
	}
	
	public TipoBien getTipoBien() {
		return tipoBien;
	}

	public void setTipoBien(TipoBien tipoBien) {
		this.tipoBien = tipoBien;
	}

	public int getTabActual() {
		return tabActual;
	}

	public void setTabActual(int tabActual) {
		this.tabActual = tabActual;
	}

	public int getCantidadMuebles() {
		return cantidadMuebles;
	}

	public void setCantidadMuebles(int cantidadMuebles) {
		this.cantidadMuebles = cantidadMuebles;
	}

	public boolean isMostrarEquipo() {
		return mostrarEquipo;
	}

	public void setMostrarEquipo(boolean mostrarEquipo) {
		this.mostrarEquipo = mostrarEquipo;
	}

	public boolean isMostrarMueble() {
		return mostrarMueble;
	}

	public void setMostrarMueble(boolean mostrarMueble) {
		this.mostrarMueble = mostrarMueble;
	}

	public String getNombreCompleto() {
		if(trabajador != null)
			return trabajador.getApellidos() + " " + trabajador.getNombres();
		else
			return "";
	}

	public List<Equipo> getListaEquipos() {
		return listaEquipos;
	}

	public void setListaEquipos(List<Equipo> listaEquipos) {
		this.listaEquipos = listaEquipos;
	}

	public List<Mueble> getListaMuebles() {
		return listaMuebles;
	}

	public void setListaMuebles(List<Mueble> listaMuebles) {
		this.listaMuebles = listaMuebles;
	}

	public List<Vehiculo> getListaVehiculos() {
		return listaVehiculos;
	}

	public void setListaVehiculos(List<Vehiculo> listaVehiculos) {
		this.listaVehiculos = listaVehiculos;
	}

	public Equipo getEquipoSeleccionado() {
		return equipoSeleccionado;
	}

	public void setEquipoSeleccionado(Equipo equipoSeleccionado) {
		this.equipoSeleccionado = equipoSeleccionado;
	}

	public Mueble getMuebleSeleccionado() {
		return muebleSeleccionado;
	}

	public void setMuebleSeleccionado(Mueble muebleSeleccionado) {
		this.muebleSeleccionado = muebleSeleccionado;
	}
	
	public List<Dependencia> getDependencias() {
		return dependencias;
	}

	public void setDependencias(List<Dependencia> dependencias) {
		this.dependencias = dependencias;
	}

	public Proveedor getProveedor() {
		return proveedor;
	}

	public void setProveedor(Proveedor proveedor) {
		this.proveedor = proveedor;
	}

	public Pecosa getPecosa() {
		return pecosa;
	}

	public void setPecosa(Pecosa pecosa) {
		this.pecosa = pecosa;
	}

	public OrdenCompra getOrdenCompra() {
		return ordenCompra;
	}

	public void setOrdenCompra(OrdenCompra ordenCompra) {
		this.ordenCompra = ordenCompra;
	}

	public GuiaDeRemision getGuiaderemision() {
		return guiaderemision;
	}

	public void setGuiaderemision(GuiaDeRemision guiaderemision) {
		this.guiaderemision = guiaderemision;
	}

	public ComprobanteCompra getComprobante() {
		return comprobante;
	}

	public void setComprobante(ComprobanteCompra comprobante) {
		this.comprobante = comprobante;
	}
	
	public Dependencia getArea() {
		return area;
	}

	public void setArea(Dependencia area) {
		this.area = area;
	}

	public List<Dependencia> getAreas() {
		return areas;
	}

	public void setAreas(List<Dependencia> areas) {
		this.areas = areas;
	}

	public Dependencia getDependencia() {
		return dependencia;
	}

	public void setDependencia(Dependencia dependencia) {
		this.dependencia = dependencia;
	}
	
	public List<String> getListaSeries() 
	{
		return listaSeries;
	}

	public void setListaSeries(List<String> listaSeries) {
		this.listaSeries = listaSeries;
	}
	
	public Vehiculo getVehiculo() {
		return vehiculo;
	}

	public void setVehiculo(Vehiculo vehiculo) {
		this.vehiculo = vehiculo;
	}

	public Mueble getMueble() {
		return mueble;
	}

	public void setMueble(Mueble mueble) {
		this.mueble = mueble;
	}
	
	public Equipo getEquipo() {
		return equipo;
	}

	public void setEquipo(Equipo equipo) {
		this.equipo = equipo;
	}
	
	public String getTipo() {
		return tipo;
	}

	public void setTipo(String tipo) {
		this.tipo = tipo;
	}
	
	public List<TipoBien> getTiposBienes() {
		return tiposBienes;
	}

	public void setTiposBienes(List<TipoBien> tiposBienes) {
		this.tiposBienes = tiposBienes;
	}

	public Trabajador getTrabajador() {
		return trabajador;
	}

	public void setTrabajador(Trabajador trabajador) {
		this.trabajador = trabajador;
	}

	public List<Trabajador> getTrabajadores() {
		return trabajadores;
	}

	public void setTrabajadores(List<Trabajador> trabajadores) {
		this.trabajadores = trabajadores;
	}

	public String getSerieSeleccionada() {
		return serieSeleccionada;
	}

	public void setSerieSeleccionada(String serieSeleccionada) {
		this.serieSeleccionada = serieSeleccionada;
	}

	public TipoAdquisicion getTipoAdquisicion() {
		return tipoAdquisicion;
	}

	public void setTipoAdquisicion(TipoAdquisicion tipoAdquisicion) {
		this.tipoAdquisicion = tipoAdquisicion;
	}
}
